/**************************************************************************/ /**
 * @file     load_mv.h
 * @brief    播放 avi / wav 音视频
 * @version  V3.5
 * @date     2022.09.15
******************************************************************************/
#ifndef __LOAD_MV_H__
#define __LOAD_MV_H__

//-----------------------------------------------------头文件依赖----------------------------------------------//
#include "SWM341.h"

//-------------------------------------------------------全局宏------------------------------------------------//
// avi 视频播放用定时器
#define AVI_TIMR					BTIMR0
#define AVI_TIMR_HANDLER			BTIMR0_Handler

//------------------------------------------------------类型声明-----------------------------------------------//
typedef enum
{
	LAYER_1_GUI 	= LCD_LAYER_1,
	LAYER_2_VIDEO	= LCD_LAYER_2
} lcd_layer_t; //详见 swm341_lcd.h 

typedef enum 
{
	FREE = 0,
	BUSY
}mv_flag_t;

//------------------------------------------------------变量声明-----------------------------------------------//


//------------------------------------------------------函数声明-----------------------------------------------//
/**
 * @brief 	音视频任务处理
 * @param 	/
 * @retval	0 - 运行		> 0 - 挂起		< 0 - 错误
 * @note	轮询
 */
int mv_task_handler(void);

/**
 * @brief 	结束播放
 * @param 	/
 * @retval	/
 * @note	/
 */
void mv_task_over(void);

/**
 * @brief 	启动播放
 * @param 	file_path : 源文件绝对路径
 * @retval	/
 * @note	/
 */
void mv_task_init(const char *file_path);

/**
 * @brief 	暂停播放
 * @param 	/
 * @retval	/
 * @note	仅实现音频
 */
void mv_task_pause(void);

/**
 * @brief 	恢复播放
 * @param 	/
 * @retval	/
 * @note	仅实现音频
 */
void mv_task_resume(void);

/**
 * @brief 	设置视频循环播放次数
 * @param 	times	: 当前播放次数
 * 			max		: 上限
 * @retval	/
 * @note	/
 */
void mv_task_set_loop(const uint32_t times, const uint32_t max);

/**
 * @brief 	获取视频循环播放次数
 * @param 	times	: 当前播放次数
 * 			max		: 上限
 * @retval	/
 * @note	/
 */
void mv_task_get_loop(uint32_t *times, uint32_t *max);

/**
 * @brief 	设置图层显示区域
 * @param 	lcd_layer	: 图层
 * 			xs / ys		: 起始位置
 * 			xe / ye		: 终止位置
 * @retval	/
 * @note	视频源大小一般不可改变, 若该函数在视频播放时调用, 可使新设置的播放区域大小自动适配源的大小(依赖 Avix 结构体)
 */
void lcd_set_post(lcd_layer_t lcd_layer, uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye);

/**
 * @brief 	视频中心跟随触摸移动
 * @param 	x / y : 触控中心
 * @retval	/
 * @note	默认为区域视频, 故调整移动图层 2 位置
 */
void video_center_with_tp(uint16_t x, uint16_t y);

/**
 * @brief 	设置图层透明度
 * @param 	lcd_layer	: 图层
 * 			alpha		: 透明度
 * @retval	/
 * @note	图层 x 的 constant alpha，用于 blending。
			Blending 公式：
			BC = (C * CONSTA + Cs * (255 - CONSTA))/255
			BC: blended color
			C : current layer color
			Cs: subjacent layers blended color
			有如下几种 blending 情况：
			图层 1 和图层 2 都使能时：先将图层 1 和背景颜色进行 blending，然后将图层 2 和
			blending 后的图层进行 blending。
			图层 1 或图层 2 仅有一个图层使能时：将被使能的图层和背景颜色进行 blending。
			两个图层都不使能时：仅显示背景色。
 */
void lcd_set_alpha(lcd_layer_t lcd_layer, uint8_t alpha);

/**
 * @brief 	设置图层色键控
 * @param 	lcd_layer			: 图层
 * 			color_key_enable	: 色键控使能
 * 			red / green	/ blue	: rgb
 * @retval	/
 * @note	LCD_FORMAT 优先于 Color Key 配置
 */
void lcd_set_color_key(lcd_layer_t lcd_layer, bool color_key_enable, uint8_t red, uint8_t green, uint8_t blue);

/**
 * @brief 	设置视频解码输出格式
 * @param 	format			: 解码输出格式，可取值JPEG_OUT_YUV、JPEG_OUT_YUVsp、JPEG_OUT_XRGB888、...详见 swm341_jpeg.h
 * 			rgb565_dither	: RGB565 dithering enable
 * @retval	/
 * @note	仅 format 为 JPEG_OUT_RGB565 时, dither 有效
 */
void video_outset_format(uint8_t format, uint8_t rgb565_dither);

#endif //__LOAD_MV_H__
